﻿using System;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using WatiN.Core;
using WatiN.Core.DialogHandlers;
using System.Diagnostics;
using System.Collections.Generic;
using System.Linq;
using System.Data.Linq;
using tea.DB;
using tea.BL;
using Util;

namespace tea.Tests
{
    [TestClass]
    public class 이력서작성
    {
        [ClassInitialize]
        public static void DB테스트준비(TestContext context)
        {
            DB.사용자삭제("test1");
            DB.사용자생성("test1", "test", "테스트", "test@test.com");
        }

        string[,] 이력서1 = new string[,] {
            { "주민등록번호",   "123456-7890123" },
            { "외국인등록번호", "234567-8901234" },
            { "생년월일", "1234-56-78" },
            {"성별", "여" },
            { "휴대전화", "123-4567" },
            {"강사전업여부", "직장보유" },
            { "집전화", "234-5678" },
            { "집우편번호", "152-716" },
            { "집주소1", "서울 구로구 항동 성공회대학교" },
            { "집주소2", "6205" },
            { "직장명", "성공회대학교" },
            { "직장부서", "전자계산소" },
            { "직장직위", "사원" },
            { "직장전화", "345-6789" },
            { "직장우편번호", "152-050" },
            { "직장주소1", "서울 구로구 구로동" },
            { "직장주소2", "6202" },
            { "자격증1", "우전면허 1종" },
            { "자격증2", "우전면허 2종" },
            { "자격증3", "우전면허 3종" }
        };

        [TestMethod]
        public void 이력서작성테스트1()
        {
            IE ie = new IE("http://localhost:6378/Guest/Login?ReturnUrl=%2f");

            // 로그인하고
            로그인.로그인하기("test1", "test", ie);

            // 이력서 화면으로 이동
            ie.Link(Find.ByText("이력서")).Click();
            Assert.IsTrue(ie.Url.Contains("/Resume/Page1"));

            // 데이터 입력 없이 저장 버튼 누르고, 에러 메시지 확인
            ie.링크누르고메시지확인(".btn-primary", "필수입력");

            // 우편번호 검색 버튼 누르고
            ie.Link(Find.BySelector("input[name=집우편번호]~a.btn")).Click();

            // 검색어 입력하고
            ie.TextField(Find.BySelector("input#우편번호대화상자_검색패턴")).Value = "성공회";

            // 검색 버튼 누르고
            ie.Button(Find.BySelector("#우편번호대화상자 button")).ClickNoWait();
            ie.WaitUntilContainsText("성공회대학교", 2);

            // 검색 결과의 첫번째 항목 선택하고 확인 버튼 누르기
            ie.Eval("$('div[data-key]:first-child').addClass('ui-selected')"); 
            ie.Link(Find.ByText("확인")).Click();

            // 자동 입력된 집주소 값 확인
            Assert.AreEqual(ie.TextField(Find.ByName("집우편번호")).Text, "152-716");
            Assert.AreEqual(ie.TextField(Find.ByName("집주소1")).Text, "서울 구로구 항동 성공회대학교 ");

            // 데이터 입력하기
            ie.폼데이터입력(이력서1);
                
            // 저장하고
            ie.링크누르고메시지확인(".btn-primary", "저장");

            // 나갔다가
            ie.Link(Find.ByText("공지사항")).Click();
            Assert.IsTrue(ie.Url.Contains("/Bbs/List"));

            // 다시 들어와서
            ie.Link(Find.ByText("이력서")).Click();
            Assert.IsTrue(ie.Url.Contains("/Resume/Page1"));

            // 아까 저장한 값이 맞는지 확인
            ie.폼데이터확인(이력서1);

            로그인.로그아웃하기(ie);
            ie.WaitForComplete();
            ie.Dispose();
        }

        string[][,] 학력1 = new string[][,] {
            new string [,] { 
                {"구분", "학사"},
                {"기간1", "2001-01"},
                {"기간2", "2001-02"},
                {"국가", "국가1"},
                {"학교명", "카운트 학교명1"},
                {"학과", "학과1"},
                {"전공", "전공1"}
            },
            new string [,] { 
                {"구분", "석사"},
                {"기간1", "2002-01"},
                {"기간2", "2002-02"},
                {"국가", "국가2"},
                {"학교명", "카운트 학교명2"},
                {"학과", "학과2"},
                {"전공", "전공2"}
            },
            new string [,] { 
                {"구분", "박사"},
                {"기간1", "2003-01"},
                {"기간2", "2003-02"},
                {"국가", "국가3"},
                {"학교명", "카운트 학교명3"},
                {"학과", "학과3"},
                {"전공", "전공3"}
            }, 
            new string [,] { 
                {"구분", "박사수료"},
                {"기간1", "2004-01"},
                {"기간2", "2004-02"},
                {"국가", "국가4"},
                {"학교명", "카운트 학교명4"},
                {"학과", "학과4"},
                {"전공", "전공4"}
            }
        };

        string[][ ,] 경력1 = new string[][,] {
            new string [,] { 
                {"기간1", "2001-01"},
                {"기간2", "2001-02"},
                {"기관", "국가1"},
                {"직위", "카운트 학교명1"},
                {"내용", "학과1"}
            },
            new string [,] { 
                {"기간1", "2002-01"},
                {"기간2", "2002-02"},
                {"기관", "국가2"},
                {"직위", "카운트 학교명2"},
                {"내용", "학과2"}
            },
            new string [,] { 
                {"기간1", "2003-01"},
                {"기간2", "2003-02"},
                {"기관", "국가3"},
                {"직위", "카운트 학교명3"},
                {"내용", "학과3"}
            },
            new string [,] { 
                {"기간1", "2004-01"},
                {"기간2", "2004-02"},
                {"기관", "국가4"},
                {"직위", "카운트 학교명4"},
                {"내용", "학과4"}
            }
        };

        string[][ ,] 논문1 = new string[][,] {
            new string [,] { 
                {"구분", "국내전문학술지"},
                {"학술지명", "학술지명1"},
                {"제목", "카운트 제목1"}
            },
            new string [,] { 
                {"구분", "국제전문학술지"},
                {"학술지명", "학술지명2"},
                {"제목", "카운트 제목2"}
            },
            new string [,] { 
                {"구분", "국내학술발표"},
                {"학술지명", "학술지명3"},
                {"제목", "카운트 제목3"}
            },
            new string [,] { 
                {"구분", "국제학술발표"},
                {"학술지명", "학술지명4"},
                {"제목", "카운트 제목4"}
            }
        };

        const int DELAY1 = 50;

        static void 이력서경력수정_테스트(IE ie, string 버튼실렉터, string 대화상자DIV, string 출력DIV, string[][ ,] 데이터, bool 역순출력 = false)
        {
            string s;

            // 입력
            for (int i = 0; i < 3; ++i) {
                ie.Link(Find.BySelector(버튼실렉터)).Click();
                System.Threading.Thread.Sleep(DELAY1);

                ie.폼데이터입력(데이터[i]);

                ie.Button(Find.BySelector(대화상자DIV + " .btn-primary")).Click();
                ie.WaitAjax();
            }

            // 입력값 확인
            for (int i = 0; i < 3; ++i) {
                var index = 역순출력 ? 3 - i : i + 1;
                var selector = string.Format(출력DIV + " tr.hover:nth-child({0})", index);
                s = ie.TableRow(Find.BySelector(selector)).InnerHtml;
                for (int j = 0; j < 데이터[i].GetLength(0); ++j)
                    Assert.IsTrue(s.Contains(데이터[i][j, 1]));
            }

            // 수정
            ie.TableRow(Find.BySelector(출력DIV + " tr.hover:nth-child(1)")).Click(); // 대화상자 열고
            System.Threading.Thread.Sleep(DELAY1);

            ie.폼데이터확인(데이터[역순출력 ? 2 : 0]);

            ie.폼데이터입력(데이터[3]);

            ie.Button(Find.BySelector(대화상자DIV + " .btn-primary")).Click(); // 저장
            ie.WaitAjax();

            // 수정값 확인
            s = ie.TableRow(Find.BySelector(출력DIV + " tr.hover:nth-child(1)")).InnerHtml;
            for (int j = 0; j < 데이터[3].GetLength(0); ++j)
                Assert.IsTrue(s.Contains(데이터[3][j, 1]));

            // 삭제
            for (int i = 0; i < 3; ++i) {

                // 삭제
                ie.TableRow(Find.BySelector(출력DIV + " tr.hover:nth-child(1)")).Click(); // 대화상자 열고
                System.Threading.Thread.Sleep(DELAY1);
                ie.Button(Find.BySelector(대화상자DIV + " .modal-footer button:nth-child(2)")).Click(); // 삭제 클릭
                ie.WaitAjax();

                // 삭제 후 값 없음 확인
                Assert.AreEqual(ie.CountText("카운트", 출력DIV + " tbody"), 2 - i);
            }
        }

        [TestMethod]
        public void 이력서작성테스트2()
        {
            IE ie = new IE("http://localhost:6378/Guest/Login?ReturnUrl=%2f");
            로그인.로그인하기("test1", "test", ie);

            // 이력서 화면으로 이동
            ie.Link(Find.ByText("이력서")).Click();
            Assert.IsTrue(ie.Url.Contains("/Resume/Page1"));
            ie.Link(Find.ByText("경력")).Click();
            Assert.IsTrue(ie.Url.Contains("/Resume/Page2"));

            이력서경력수정_테스트(ie, "div.학력 div a.btn", "#이력서학력", "#이력서학력출력", 학력1, true);
            이력서경력수정_테스트(ie, "div.교육경력 div a.btn", "#이력서경력", "#이력서교육경력출력", 경력1);
            이력서경력수정_테스트(ie, "div.교육외경력 div a.btn", "#이력서경력", "#이력서교육외경력출력", 경력1);
            이력서경력수정_테스트(ie, "div.논문 div a.btn", "#이력서논문", "#이력서논문출력", 논문1);

            ie.WaitForComplete();
            ie.Dispose();
        }

        string[,] 학위논문1 = {
            { "논문제목", "논문제목1" },
            { "논문요약", "논문요약1 논문요약1 논문요약1 논문요약1 논문요약1 논문요약1 논문요약1 논문요약1 논문요약1 논문요약1 논문요약1 논문요약1 논문요약1 논문요약1 논문요약1논문요약1논문요약1" }
        };

        [TestMethod]
        public void 이력서작성테스트3()
        {
            IE ie = new IE("http://localhost:6378/Guest/Login?ReturnUrl=%2f");
            로그인.로그인하기("test1", "test", ie);

            // 이력서 화면으로 이동
            ie.Link(Find.ByText("이력서")).Click();
            Assert.IsTrue(ie.Url.Contains("/Resume/Page1"));
            ie.Link(Find.ByText("최종학위논문")).Click();
            Assert.IsTrue(ie.Url.Contains("/Resume/Page3"));

            ie.폼데이터입력(학위논문1);
            ie.링크누르고메시지확인(".btn-primary", "저장");

            // 나갔다기 다시 들어오기
            ie.Link(Find.ByText("이력서")).Click();
            Assert.IsTrue(ie.Url.Contains("/Resume/Page1"));
            ie.Link(Find.ByText("최종학위논문")).Click();
            Assert.IsTrue(ie.Url.Contains("/Resume/Page3"));

            ie.폼데이터확인(학위논문1);

            ie.WaitForComplete();
            ie.Dispose();
        }

        private void 사진있음확인(IE ie)
        {
            Assert.IsTrue(ie.Image(Find.ById("사진")).Exists);
            Assert.IsTrue(ie.ContainsText("사진 삭제"));
        }

        private void 사진없음확인(IE ie)
        {
            Assert.IsFalse(ie.Image(Find.ById("사진")).Exists);
            Assert.IsFalse(ie.ContainsText("사진 삭제"));
        }

        private void 파일있음확인(IE ie)
        {
            Assert.IsTrue(ie.ContainsText("내려받기"));
            Assert.IsTrue(ie.ContainsText("파일 삭제"));
            Assert.IsTrue(ie.ContainsText("duck.zip"));
        }

        private void 파일없음확인(IE ie)
        {
            Assert.IsFalse(ie.ContainsText("내려받기"));
            Assert.IsFalse(ie.ContainsText("파일 삭제"));
            Assert.IsFalse(ie.ContainsText("duck.zip"));
        }

        [TestMethod]
        public void 이력서작성테스트4()
        {
            IE ie = new IE("http://localhost:6378/Guest/Login?ReturnUrl=%2f");
            로그인.로그인하기("test1", "test", ie);

            // 이력서 화면으로 이동
            ie.Link(Find.ByText("이력서")).Click();
            Assert.IsTrue(ie.Url.Contains("/Resume/Page1"));
            ie.Link(Find.ByText("사진&학위증")).Click();
            Assert.IsTrue(ie.Url.Contains("/Resume/Page4"));

            string path = AppDomain.CurrentDomain.BaseDirectory;

            사진없음확인(ie);

            // 사진 올리기
            ie.UploadFile("사진 올리기", path + @"\data\A1.png");
            ie.Button(Find.ByText("업로드")).Click();
            사진있음확인(ie);
            
            // 사진 삭제
            ie.컨펌버튼누르기("사진 삭제");
            ie.WaitAjax();
            사진없음확인(ie);

            파일없음확인(ie);

            ie.UploadFile("파일 올리기", path + @"\data\duck.zip");
            ie.Button(Find.ByText("업로드")).Click();
            파일있음확인(ie);

            // 사진 삭제
            ie.컨펌버튼누르기("파일 삭제");
            ie.WaitAjax();
            파일없음확인(ie);

            ie.WaitForComplete();
            ie.Dispose();
        }


    }
}

